import axios from 'axios';

const instance = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 5000,
});

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    return response;
  },
  async (error) => {
    const originalRequest = error.config;
    if (error.response.status === 401 && !originalRequest._retry) {
      originalRequest._retry = true;
      const refreshToken = localStorage.getItem('refreshToken');
      const res = await axios.post('/refreshToken', { refreshToken });
      if (res.status === 200) {
        localStorage.setItem('token', res.data.token);
        localStorage.setItem('refreshToken', res.data.refreshToken);
        return instance(originalRequest);
      }
    }
    return Promise.reject(error);
  }
);

export default instance;


// 这个封装中，我们使用了axios的拦截器来实现token的自动添加和刷新。在请求拦截器中，我们从localStorage中获取token，并将其添加到请求头中。在响应拦截器中，我们检查响应状态码是否为401，如果是，则说明token已过期，我们发送一个刷新token的请求，并将新的token和refreshToken存储到localStorage中。然后重新发送原始请求。如果刷新token失败，则直接返回错误。








这段代码可以进行如下优化：

将 isRefreshing 和 requests 改为局部变量，避免全局变量污染。
使用 async/await 语法，使代码更加简洁易读。
使用 try/catch 语句，避免使用 Promise.catch()。
将刷新 token 和重新登录的逻辑分离，使代码更加清晰。
优化后的代码如下：
async function refreshToken(error) {
  let isRefreshing = false;
  let requests = [];

  const refreshAccessToken = async () => {
    try {
      isRefreshing = true;
      const token = localStorage.getItem('token');
      const response = await axios.post('/api/refresh_token', { token });
      localStorage.setItem('token', response.data.token);
      return response.data.token;
    } catch (error) {
      throw new Error('Refresh token failed');
    } finally {
      isRefreshing = false;
    }
  };

  const reLogin = async () => {
    // 重新登录逻辑
  };

  if (!isRefreshing) {
    const token = await refreshAccessToken();
    error.config.headers['Authorization'] = `Bearer ${token}`;
    requests.forEach(cb => cb(token));
    requests = [];
    return axios(error.config);
  } else {
    return new Promise(resolve => {
      requests.push(token => {
        error.config.headers['Authorization'] = `Bearer ${token}`;
        resolve(axios(error.config));
      });
    });
  }
}
